package com.qut.graduate.busrtquery.utils.common;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author WLL
 * @Time: 2019/4/26 17:07
 */
public class FormatUtils {

    /**
     * 含有unicode 的字符串转一般字符串
     *
     * @param unicodeStr 混有Unicode的字符串
     * @return
     */
    public static String unicodeToString(String unicodeStr) {
        int length = unicodeStr.length();
        int count = 0;
        // 正则匹配条件，可匹配“\\u”1到4位，一般是4位可直接使用 String regex = "\\\\u[a-f0-9A-F]{4}";
        String regex = "\\\\u[a-f0-9A-F]{1,4}";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(unicodeStr);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String oldChar = matcher.group(); // 原本的Unicode字符
            String newChar = unicodeToCn(oldChar); // 转换为普通字符
            // int index = unicodeStr.indexOf(oldChar);
            // 在遇见重复出现的unicode代码的时候会造成从源字符串获取非unicode编码字符的时候截取索引越界等
            int index = matcher.start();
            sb.append(unicodeStr.substring(count, index)); // 添加前面不是unicode的字符
            sb.append(newChar); // 添加转换后的字符
            count = index + oldChar.length(); // 统计下标移动的位置
        }
        sb.append(unicodeStr.substring(count, length)); // 添加末尾不是Unicode的字符
        return sb.toString();
    }

    /**
     * unicode转中文
     *
     * @param unicode
     * @return
     */
    public static String unicodeToCn(String unicode) {
        // 以 \ u 分割，因为java注释也能识别unicode，因此中间加了一个空格
        String[] strs = unicode.split("\\\\u");
        String returnStr = "";
        // 由于unicode字符串以 \ u 开头，因此分割出的第一个字符是""。
        for (int i = 1; i < strs.length; i++) {
            returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
        }
        return returnStr;
    }

    /**
     * 中文转unicode
     *
     * @param cn
     * @return
     */
    public static String cnToUnicode(String cn) {
        char[] chars = cn.toCharArray();
        String returnStr = "";
        for (int i = 0; i < chars.length; i++) {
            returnStr += "\\u" + Integer.toString(chars[i], 16);
        }
        return returnStr;
    }

    /**
     * 判断字符串是否为 null 或全为空白字符
     *
     * @param s
     * @return
     */
    public static boolean isSpace(final String s) {
        if (s == null)
            return true;
        for (int i = 0, len = s.length(); i < len; ++i) {
            if (!Character.isWhitespace(s.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断一个字符串是否是数字。
     *
     * @param string
     * @return
     */
    public static boolean isNumber(String string) {
        if (string == null)
            return false;
        Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$");
        return pattern.matcher(string).matches();
    }

    /**
     * 验证手机号格式是否正确
     *
     * @param phone
     * @return
     */
    public static boolean isPhone(String phone) {
        String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(phone);
        return m.matches();
    }

    /**
     * 验证用户名只包含字母，数字，中文
     *
     * @param username
     * @return
     */
    public static boolean isUserName(String username) {
        Pattern p = Pattern.compile("^[a-zA-Z0-9\\u4e00-\\u9fa5]{3,12}+$");
        Matcher m = p.matcher(username);
        return m.matches();
    }

    /**
     * 验证密码是否是数字与字母的组合
     *
     * @param password 密码
     * @return 返回值
     */
    public static boolean isPassword(String password) {
        Pattern p = Pattern.compile("^[a-zA-Z0-9]{6,12}$");
        Matcher m = p.matcher(password);
        return m.matches();
    }

    /**
     * 验证码格式验证
     *
     * @param checkCode 验证码
     * @return 返回值
     */
    public static boolean isCheckCode(String checkCode) {
        Pattern p = Pattern.compile("^\\d{6}$");
        Matcher m = p.matcher(checkCode);
        return m.matches();
    }

    /**
     * 邮箱格式验证
     *
     * @param email
     * @return
     */
    public static boolean isEmail(String email) {
        if (null == email || "".equals(email)) return false;
        //Pattern p = Pattern.compile("\\w+@(\\w+.)+[a-z]{2,3}"); //简单匹配
        Pattern p = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");//复杂匹配
        Matcher m = p.matcher(email);
        return m.matches();
    }

}
